<?php
/**
 * 公共函数库
 */

/**
 * 求两个日期之间相差的天数
 * (针对1970年1月1日之后，求之前可以采用泰勒公式)
 * @param string $day1
 * @param string $day2
 * @return number
 */
if (!function_exists('diffBetweenTwoDays')) {
    function diffBetweenTwoDays($day1, $day2)
    {
        $second1 = strtotime($day1);
        $second2 = strtotime($day2);
        if ($second1 <= $second2) {
            $tmp = $second2;
            $second2 = $second1;
            $second1 = $tmp;
            return ($second1 - $second2) / 86400;
        } else {
            return -1;
        }
    }
}

/****************************************
 * 获取上周一周的日期，如：
 * $start_date=2015-05-25 00:00:00
 * $start_date=2015-06-01 00:00:00
 ****************************************/
if (!function_exists('getSearchDate')) {
    function getSearchDate()
    {
        $date = date('Y-m-d');  //当前日期
        $first = 1; //$first =1 表示每周星期一为开始日期 0表示每周日为开始日期
        $w = date('w', strtotime($date));  //获取当前周的第几天 周日是 0 周一到周六是 1 - 6
        $now_start = date('Y-m-d', strtotime("$date -" . ($w ? $w - $first : 6) . ' days')); //获取本周开始日期，如果$w是0，则表示周日，减去 6 天
        $now_end = date('Y-m-d', strtotime("$now_start +6 days"));  //本周结束日期
        $last_start = date('Y-m-d', strtotime("$now_start - 7 days"));  //上周开始日期
        $last_end = date('Y-m-d', strtotime("$now_start - 1 days"));  //上周结束日期
        //获取上周起始日期
        $data['start_date'] = $last_start;
        //获取本周起始日期
        $data['end_date'] = $last_end;
        return $data;
    }
}

if (!function_exists('clear_html')) {
    /**
     * 完全过虑HTML结构
     * @author Flc <2016-08-12 17:05:14>
     * @param  string $str 字符串
     * @return string
     */
    function clear_html($str)
    {
        $str = strip_tags($str);
        //首先去掉头尾空格
        $str = trim($str);
        //接着去掉两个空格以上的
        $str = preg_replace('/\s(?=\s)/', '', $str);
        //最后将非空格替换为一个空格
        $str = preg_replace('/[\n\r\t]/', ' ', $str);
        $str = str_replace('&nbsp;', '', $str);
        return trim($str);
    }
}

if (!function_exists('get_url')) {
    /**
     * 获取当前访问的地址
     * @author Flc <2016-09-02 10:04:07>
     * @return string
     */
    function get_url()
    {
        $sys_protocal = isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443' ? 'https://' : 'http://';
        $php_self = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
        $path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
        $relate_url = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : $php_self . (isset($_SERVER['QUERY_STRING']) ? '?' . $_SERVER['QUERY_STRING'] : $path_info);
        return $sys_protocal . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '') . $relate_url;
    }
}

if (!function_exists('uuid')) {
    /**
     * 生成唯一标识UUID
     * @author Flc <2016-08-22 10:51:15>
     * @return strign
     */
    function uuid()
    {
        if (function_exists('com_create_guid')) {
            $uuid = com_create_guid();
        } else {
            mt_srand((double)microtime() * 10000);  //optional for php 4.2.0 and up.

            $charid = strtoupper(md5(uniqid(rand(), true)));
            $hyphen = chr(45);  // "-"
            $uuid = chr(123)  // "{"
                . substr($charid, 0, 8) . $hyphen
                . substr($charid, 8, 4) . $hyphen
                . substr($charid, 12, 4) . $hyphen
                . substr($charid, 16, 4) . $hyphen
                . substr($charid, 20, 12)
                . chr(125);  // "}"
        }

        $uuid = trim($uuid, '{}');
        return $uuid;
    }
}

if (!function_exists('hash_make')) {
    /**
     * 哈希加密;用于密码加密
     * 要求：PHP>=5.5
     * @author Flc <2016-08-22 10:51:15>
     * @return strign
     */
    function hash_make($value)
    {
        return \Common\Support\Hash::make($value);
    }
}

if (!function_exists('hash_check')) {
    /**
     * 哈希加密校验;用户密码校验
     * 要求：PHP>=5.5
     * @author Flc <2016-08-23 11:26:26>
     * @param  string $value 明文密码
     * @param  string $hashedValue 密文密码
     * @return boolean
     */
    function hash_check($value, $hashedValue)
    {
        return \Common\Support\Hash::check($value, $hashedValue);
    }
}

if (!function_exists('is_mobile')) {
    /**
     * 验证是否为手机号
     * @author Flc <2016-08-24 17:05:02>
     * @param string $str 手机号
     * @return boolean
     */
    function is_mobile($str)
    {
        if (strlen($str) != 11) return false;
        if (!preg_match("/^(((13[0-9]{1})|(15[0-9]{1})|(17[0-9]{1})|(18[0-9]{1}))+\d{8})$/", $str)) return false;
        return true;
    }
}

if (!function_exists('is_email')) {
    /**
     * 验证是否为邮箱
     * @author Flc <2016-08-24 17:05:55>
     * @param  string $str 邮箱
     * @return boolean
     */
    function is_email($str)
    {
        if (!preg_match("/^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/", $str)) return false;
        return true;
    }
}

if (!function_exists('is_money')) {
    /**
     * 判断是否为金额(最多2为小数)
     * @author Flc <2016-08-24 17:06:40>
     * @param  number $str 数字
     * @return boolean
     */
    function is_money($str)
    {
        if (!preg_match("/^\d{0,10}\.{0,1}(\d{1,2})$/", $str)) return false;
        return true;
    }
}


if (!function_exists('generateBirthday')) {
    /**
     * 根据身份证生成生日日期
     * @param  [type] $card_no [description]
     * @return [type]          返回时间戳|null
     */
    function generateBirthday($card_no)
    {
        $birth = null;
        if (strlen($card_no) == 18) {
            $birth = strtotime(substr($card_no, 6, 8));
        } elseif (strlen($card_no) == 15) {
            $birth = strtotime('19' . substr($card_no, 6, 6));
        }
        return $birth;
    }
}


if (!function_exists('isChineseName')) {
    function isChineseName($name)
    {
        if (preg_match('/^([\xe4-\xe9][\x80-\xbf]{2}){2,4}$/', $name)) {
            return true;
        } else {
            return false;
        }
    }
}

if (!function_exists('ageHandle')) {
    /**
     * 年龄计算
     * @param  [type] $startDate 开始计算的时间戳
     * @param  [type] $endDate   默认就是到现在
     * @return [type]            [description]
     */
    function ageHandle($startDate, $endDate = '')
    {
        $startDate = date_create(date('Y-m-d', $startDate));
        $endDate = date_create(date('Y-m-d', empty($endDate) ? time() : $endDate));

        $interval = date_diff($startDate, $endDate);
        return $interval->format('%y');
    }
}

if (!function_exists('idcard_verify_number')) {
    /**
     * 计算身份证最后一位校验码
     * @param  [type] $idcard_base [description]
     * @return [type]              [description]
     */
    function idcard_verify_number($idcard_base)
    {
        if (strlen($idcard_base) != 17) {
            return false;
        }
        // 加权因子
        $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);

        // 校验码对应值
        $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

        $checksum = 0;
        for ($i = 0; $i < strlen($idcard_base); $i++) {
            $checksum += substr($idcard_base, $i, 1) * $factor[$i];
        }

        $mod = strtoupper($checksum % 11);
        $verify_number = $verify_number_list[$mod];

        return $verify_number;
    }
}

if (!function_exists('idcard_15to18')) {
    /**
     * 将身份证从15位升级到18位
     * @param  [type] $idcard [description]
     * @return [type]         [description]
     */
    function idcard_15to18($idcard)
    {
        $idcard = trim($idcard);
        $length = strlen($idcard);
        if ($length == 18) {
            return $idcard;
        } elseif ($length != 15) {
            return false;
        } else {
            // 如果身份证顺序码是996 997 998 999，这些是为百岁以上老人的特殊编码
            if (array_search(substr($idcard, 12, 3), array('996', '997', '998', '999')) !== false) {
                $idcard = substr($idcard, 0, 6) . '18' . substr($idcard, 6, 9);
            } else {
                $idcard = substr($idcard, 0, 6) . '19' . substr($idcard, 6, 9);
            }
        }
        $idcard = $idcard . idcard_verify_number($idcard);
        return $idcard;
    }
}


if (!function_exists('idcard_checksum18')) {
    /**
     * 18位身份证号码验证
     * @param  [type] $idcard [description]
     * @return [type]         [description]
     */
    function idcard_checksum18($idcard)
    {
        $idcard = trim($idcard);
        if (strlen($idcard) != 18) {
            return false;
        }
        $aCity = array(11 => "北京", 12 => "天津", 13 => "河北", 14 => "山西", 15 => "内蒙古",
            21 => "辽宁", 22 => "吉林", 23 => "黑龙江",
            31 => "上海", 32 => "江苏", 33 => "浙江", 34 => "安徽", 35 => "福建", 36 => "江西", 37 => "山东",
            41 => "河南", 42 => "湖北", 43 => "湖南", 44 => "广东", 45 => "广西", 46 => "海南",
            50 => "重庆", 51 => "四川", 52 => "贵州", 53 => "云南", 54 => "西藏",
            61 => "陕西", 62 => "甘肃", 63 => "青海", 64 => "宁夏", 65 => "新疆",
            71 => "台湾", 81 => "香港", 82 => "澳门",
            91 => "国外");
        //非法地区
        if (!array_key_exists(substr($idcard, 0, 2), $aCity)) {
            return false;
        }
        //验证生日
        if (!checkdate(substr($idcard, 10, 2), substr($idcard, 12, 2), substr($idcard, 6, 4))) {
            return false;
        }
        $idcard_base = substr($idcard, 0, 17);
        if (idcard_verify_number($idcard_base) != strtoupper(substr($idcard, 17, 1))) {
            return false;
        } else {
            return true;
        }
    }
}

if (!function_exists('idcard_check')) {
    /**
     * 身份证合法性校验（包含15或18位）
     * @return boolean
     */
    function idcard_check($idcard)
    {
        $idcard = trim($idcard);

        if (strlen($idcard) == 15) {
            $idcard = idcard_15to18($idcard);
        }

        return idcard_checksum18($idcard);
    }
}

if (!function_exists('idcard_sex')) {
    /**
     * 通过身份证号获取性别
     * @param  string $idcard 身份证号
     * @return integer|false  1为男；2为女；false为不合法身份证
     */
    function idcard_sex($idcard)
    {
        $idcard = trim($idcard);

        if (strlen($idcard) == 15) {
            $idcard = idcard_15to18($idcard);
        }

        if (!idcard_checksum18($idcard))
            return false;

        $sex = (int)substr($idcard, 16, 1);
        return $sex % 2 === 0 ? 2 : 1;
    }
}

if (!function_exists('calcAge')) {
    /**
     * 计算年龄
     * @param  [type] $time 出生日期时间戳
     * @return [type]       岁数
     */
    function calcAge($time)
    {
        // $startDate = date_create(date('Y-m-d', $time));
        $startDate = date_create(date('Y', $time) . '-01-01');
        $endDate = date_create(date('Y-m-d', time()));

        $interval = date_diff($startDate, $endDate);
        return $interval->format('%y');
    }
}

if (!function_exists('ageToDate')) {
    /**
     * 根据年龄计算出生年的时间戳
     * @param  [type] $age 岁数
     * @return [type]      时间戳
     */
    function ageToTime($age)
    {
        // $startDate = date_create(date('Y-m-d', $time));
        return time() - $age * 365 * 24 * 3600;
    }
}

if (!function_exists('generateGroupIdcard')) {
    /**
     * 生成一个集体舞的选手用户的身份证（虚拟，非个人用户）
     * @return [type] [description]
     */
    function generateGroupIdcard()
    {
        $idcard = 'G' . date('YmdHis') . str_pad(mt_rand(1, 9999), 4, '0', STR_PAD_LEFT);
        if (M('players')->where(['idcard' => $idcard])->find()) {
            return generateGroupIdcard();
        }

        return $idcard;
    }
}

if (!function_exists('getPermCombUnique')) {
    /**
     * 去重数组返回的不同排序的数组数据
     * @param  array $array 如[1, 2, 3]
     * @return array
     */
    function getPermCombUnique($array = [])
    {
        $res = getPermCombArr($array);

        if (is_array($res)) {
            $result = array_unique($res);
        } else {
            $result = array_unique([$res]);
        }

        return array_values($result);
    }
}

if (!function_exists('getPermCombArr')) {
    /**
     * 依靠数组返回不同排序的数组数据
     * @param  array $array 如[1, 2, 3]
     * @return string|array
     */
    function getPermCombArr($array = [])
    {
        $array = array_values($array);

        if (count($array) == 1)
            return end($array);

        $result = [];

        foreach ($array as $key => $value) {
            $tmpArray = $array;
            unset($tmpArray[$key]);

            $rs = getPermCombArr($tmpArray);

            if (is_array($rs)) {
                foreach ($rs as $v) {
                    $tmp = '';
                    $tmp .= $value . ',' . $v;
                    $result[] = $tmp;
                }
            } else {
                $tmp = $value . ',' . $rs;
                $result[] = $tmp;
            }
        }

        return $result;
    }
}

if (!function_exists('formatTime')) {
    /**
     * 格式化时间，返回几分钟，几小时，几天前字符串
     * @param  [type] $time [时间戳]
     * @return [type]       [字符串]
     */
    function formatTime($time)
    {
        $diff = $_SERVER['REQUEST_TIME'] - $time;//请求程序时间
        //$diff = time() - $time;//系统时间
        $day = floor($diff / 86400);
        $free = $diff % 86400;
        if ($day > 0) {
            return $day . "天前";
        } else {
            if ($free > 0) {
                $hour = floor($free / 3600);
                $free = $free % 3600;
                if ($hour > 0) {
                    return $hour . "小时前";
                } else {
                    if ($free > 0) {
                        $min = floor($free / 60);
                        $free = $free % 60;
                        if ($min > 0) {
                            return $min . "分钟前";
                        } else {
                            if ($free > 0) {
                                return $free . "秒前";
                            } else {
                                return '刚刚';
                            }
                        }
                    } else {
                        return '刚刚';
                    }
                }
            } else {
                return '刚刚';
            }
        }
    }
}

if (!function_exists('getImgUrl')) {
    //返回图片服务器地址
    function getImgUrl($file_id)
    {
        $info = M('files')->where(['file_id' => $file_id])->find();
        if ($info) {
            $path = '/' . $info['filepath'];
        } else {
            $path = '';
        }
        return $path;
    }
}

if (!function_exists('getInviteCode')) {
    /**
     * 生成邀请码
     * @return string
     */
    function getInviteCode($type = 1)
    {
        if ($type == 1) {//数字
            $ret = substr(base_convert(md5(uniqid(md5(microtime(true)), true)), 16, 10), 0, 8);
        } else {//英文+数字
            $code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
            $rand = $code[rand(0, 25)]
                . strtoupper(dechex(date('m')))
                . date('d') . substr(time(), -5)
                . substr(microtime(), 2, 5)
                . sprintf('%02d', rand(0, 99));
            for (
                $a = md5($rand, true),
                $s = '0123456789ABCDEFGHIJKLMNOPQRSTUV',
                $ret = '',
                $f = 0;
                $f < 8;
                $g = ord($a[$f]),
                $ret .= $s[($g ^ ord($a[$f + 8])) - $g & 0x1F],
                $f++
            ) ;
        }

        return $ret;
    }
}

if (!function_exists('sex2Str')) {
    /**
     * 生成邀请码
     * @return string
     */
    function sex2Str($sex)
    {
        switch ($sex){
            case '1':
                return '男';
            case '2':
                return '女';
            default:
                return '未知';
        }
    }
}

if (!function_exists('specialty2Str')) {
    function specialty2Str($specialty){
        switch ($specialty){
            case '1':
                return '车身广告安装';
            case '2':
                return '店铺广告安装';
            case '3':
                return '标识标牌';
            default:
                return '';
        }
    }
}

if (!function_exists('workerOrderStatus2Str')) {
    function workerOrderStatus2Str($workerOrderStatus){
        switch ($workerOrderStatus){
            case '1':
                return '待领物料';
            case '2':
                return '待施工';
            case '3':
                return '上画进行中';
            case '4':
                return '上画待验收';
            case '5':
                return '上画验收成功';
            case '6':
                return '下画进行中';
            case '7':
                return '下画待验收';
            case '8':
                return '下画验收完成';
            case '9':
                return '已完成';
            default:
                return '';
        }
    }
}
